#ifndef PROTOCOL_H
#define PROTOCOL_H

#include <QObject>
#include <QImage>
#include <QPoint>
#include <QRect>
#include <Qt>
#include <QVariantMap>

class Protocol : public QObject
{
    Q_OBJECT

public:
    explicit Protocol(QObject *parent = nullptr);
    virtual ~Protocol();

    // 连接和断开连接
    virtual bool connectToHost(const QString &host, int port, const QString &password) = 0;
    virtual void disconnectFromHost() = 0;
    
    // 获取桌面图像
    virtual QImage getDesktopImage() const = 0;
    
    // 发送输入事件
    virtual void sendMouseEvent(const QPoint &pos, Qt::MouseButton button, bool pressed) = 0;
    virtual void sendKeyEvent(int key, bool pressed) = 0;
    virtual void sendText(const QString &text) = 0;
    
    // 帧缓冲区管理
    virtual void requestFrame(const QRect &region) = 0;
    virtual void requestFullFrame() = 0;
    
    // 协议特定功能
    virtual QStringList supportedFeatures() const = 0;
    virtual bool hasFeature(const QString &feature) const = 0;
    
    // 配置管理
    virtual void setConfiguration(const QVariantMap &config) = 0;
    virtual QVariantMap getConfiguration() const = 0;
    
    // 性能相关
    virtual int getFramerate() const = 0;
    virtual void setFramerate(int fps) = 0;
    virtual QSize getRemoteDesktopSize() const = 0;

signals:
    // 帧更新信号
    void frameUpdated();
    void frameUpdated(const QRect &region);
    
    // 连接状态信号
    void connected();
    void disconnected();
    void connectionError(const QString &error);
    
    // 剪贴板更新信号
    void clipboardUpdated(const QString &text);
    
    // 其他事件信号
    void bellReceived();
    void desktopSizeChanged(const QSize &newSize);

protected:
    QString host;
    int port;
    QString password;
    bool isConnected;
};

#endif // PROTOCOL_H